package com.example.demo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.demo.domain.dto.CategoryQuery;
import com.example.demo.domain.dto.Result;
import com.example.demo.domain.entity.Category;
import com.example.demo.service.CategoryService;
import com.example.demo.util.PageUtil;
import com.example.demo.validations.ForCreate;
import com.example.demo.validations.ForUpdate;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类管理
 *
 * @author renliang
 */
@RestController
@AllArgsConstructor
@RequestMapping("/api/category")
public class CategoryController {
    private final CategoryService service;

    @GetMapping("/{id}")
    public Result<Category> getById(@PathVariable("id") Long id) {
        return Result.success(service.getById(id));
    }

    /**
     * 分页查询
     *
     * @param param 查询参数
     * @return 查询结果
     */
    @GetMapping("/page")
    public Result<IPage<Category>> page(Category param) {
        IPage<Category> page = service.customizePage(PageUtil.getPage(Category.class), param);
        return Result.success(page);
    }

    /**
     * 根据父节点查询子节点
     *
     * @param parentId 父节点ID
     * @param cascade  是否级联查询
     * @return 所有子节点
     */
    @GetMapping("/children/{parentId}")
    public Result<List<Category>> getByParentId(@PathVariable Long parentId,
                                                @RequestParam(value = "cascade", required = false, defaultValue = "false") Boolean cascade) {
        return Result.success(service.getByParentId(parentId, cascade));
    }

    /**
     * 列表查询
     *
     * @param param 查询参数
     * @return 查询结果
     */
    @GetMapping("/list")
    public Result<?> list(CategoryQuery param) {
        return Result.success(service.customizeList(param));
    }

    /**
     * 树形结构数据查询
     *
     * @param param 查询结果
     * @return 查询结果
     */
    @GetMapping("/tree")
    public Result<?> tree(CategoryQuery param) {
        return Result.success(service.tree(param));
    }

    /**
     * 新增分类
     *
     * @param param 参数
     * @return 新增结果
     */
    @PostMapping
    public Result<?> add(@RequestBody @Validated(ForCreate.class) Category param) {
        return Result.success(service.addCategory(param));
    }

    /**
     * 更新分类
     *
     * @param param 参数
     * @return 更新结果
     */
    @PutMapping
    public Result<?> update(@RequestBody @Validated(ForUpdate.class) Category param) {
        return Result.success(service.updateCategory(param));
    }

    /**
     * 删除分类
     *
     * @param ids     主键列表
     * @param cascade 是否级联删除
     * @return 响应
     */
    @DeleteMapping
    public Result<?> remove(@RequestBody List<Long> ids,
                            @RequestParam(value = "cascade", required = false, defaultValue = "false") Boolean cascade) {
        service.deleteCategory(ids, cascade);
        return Result.success();
    }
}
